package com.priox.sigar.application.sociedad;

import com.googlecode.ehcache.annotations.Cacheable;
import com.mm.support.mapper.DTOMapperService;
import com.priox.sigar.application.mappers.SociedadMapper;
import com.priox.sigar.client.dto.SociedadDTO;
import com.priox.sigar.domain.model.Sociedad;
import com.priox.sigar.domain.model.SociedadRepository;
import com.priox.sigar.server.infrastructure.persistence.exception.ApplicationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Component
public class RegistroSociedadAppImpl implements RegistroSociedadApp {

    @Autowired
    DTOMapperService mapperService;

    @Autowired
    SociedadRepository sociedadRepository;

    @Autowired
    SociedadMapper sociedadMapper;

    @Cacheable(cacheName = "findBySociedadId")
    public SociedadDTO findBySociedadId(String sociedadId){
        return sociedadMapper.findBySociedadId(sociedadId);

    }


    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void save(Sociedad sociedad, boolean updateMode) {
        if (updateMode) {
            sociedadRepository.merge(sociedad);
        } else {
            int cont = sociedadMapper.sociedadByNombre(sociedad.getNombre());
            if (cont > 0) {
                throw new ApplicationException("La sociedad '" + sociedad.getNombre() + "' ya esta registrado");
            }
            SociedadDTO nuevaSociedad = sociedadMapper.findBySociedadId(sociedad.getSociedadId());
            if (nuevaSociedad !=null) {
                throw new ApplicationException("La sociedad '" + sociedad.getSociedadId() + "' ya esta registrado");
            }
            sociedadRepository.persist(sociedad);
        }
    }

    public SociedadDTO findById(String sociedadId) {
        Sociedad sociedad=sociedadRepository.find(sociedadId);
        return mapperService.map(sociedad,SociedadDTO.class);
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void delete(Sociedad sociedad) {
        sociedadRepository.remove(sociedad);

    }
}
